from cmath import inf
from typing import List


class Solution:
    """
    方法：动态规划求解最大乘积子数组
          维护两个变量f_max和f_min分别记录以当前位置结尾的子数组的最大乘积和最小乘积
          对于每个数x:
          - 新的最大乘积可能是f_max*x、f_min*x或x本身
          - 新的最小乘积可能是f_max*x、f_min*x或x本身
          - 更新全局最大值ans
    
    Args:
        nums: List[int] - 输入的整数数组
    
    Returns:
        int: 连续子数组的最大乘积
    
    Time: O(n) - n为数组长度，需要遍历一次数组
    
    Space: O(1) - 只需要常数空间存储变量
    """
    def maxProduct(self, nums: List[int]) -> int:
        ans = -inf
        f_max = f_min = 1
        for x in nums:
            f_max, f_min = max(f_max * x, f_min * x, x), \
                           min(f_max * x, f_min * x, x)
            ans = max(ans, f_max)
        return ans